#!/usr/bin/env python
# -*- coding: utf-8 -*-

##########################################################################
#
#
# Relaxtives - Sistema de ayuda a escuelas para administrar parentezcos
# Copyleft (c) 2009 Escuela de Oficios San Cayetano.
# escuelasancayetano at gmail dot com
# Programado en Python
# Este programa es software libre; usted puede redistruirlo y/o modificarlo bajo
# los términos de la Licencia Pública General GNU, tal y como está publicada
# por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su
# elección) cualquier versión posterior.
#
# Este programa se distribuye con la intención de ser útil, pero SIN NINGUNA
# GARANTÍA; incluso sin la garantía implícita de USABILIDAD O UTILIDAD PARA UN
# FIN PARTICULAR. Vea la Licencia Pública General GNU para más detalles.
#
# Usted debería haber recibido una copia de la Licencia Pública General GNU
# junto a este programa; si no es así, escriba a la Free Software Foundation,
# Inc. 675 Mass Ave, Cambridge, MA 02139, EEUU.
#
#
##########################################################################




import sys
import wx
import imp
import pickle
import basededatos
import wx.lib.mixins.listctrl


class BusquedaAlumno(wx.Frame):     # Iniciamos la clase principal
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame1.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)

        # Utilizamos el modulo pickle para traer el id del alumno elegido en la busqueda
        # Para eso primero abrimos un archivo en donde habiamos guardado el dato
        f=open('x.txt','r')
        # Y mediante pikcle guardamos el dato en una variable
        x=pickle.load(f)
        # Realizamos una conexion al archivo en donde teniamos armada el acceso a la base de datos
        # El mismo fue guardado en un modulo python con el nombre basededato.py
        base=basededatos.conectando('relaxtives','relaxtives')
        # creamos un cursor de la base de dato
        c = base.cursor()
        # ejecutamos una busqueda por todos los datos que nos devuelve de acuerdo al id que rescatamos en los pasos anteriores
        c.execute('''SELECT id_alumno,apellidos,nombres,documento,responsable_1,te_resp_1,celu_resp_1,responsable_2,te_resp_2,celu_resp_2 FROM alumnos WHERE  id_alumno=%s''', (x))
        # tomamos los datos de la consulta
        q = c.fetchall()
        # cerramos el cursor
        c.close()
        # gracias a el id de abajo hacemos la busqueda para los otros datos.
        # Mediante el uso de indices logramos sacar el dato deseado
        self.id=q[0][0]
        nombre=q[0][2]
        apellido=q[0][1]
        docu=q[0][3]
        respon=q[0][4]
        tel_resp=q[0][5]
        cel_resp=q[0][6]
        respon1=q[0][7]
        tel_respon1=q[0][8]
        cel_respon1=q[0][9]
        # Volvemos a conectarnos al mismo modulo para realizar otra consulta mas acotada
        base=basededatos.conectando('relaxtives','relaxtives')
        ideses= base.cursor()
        # Ahora solo nos encargamos de tomar del alumno el id, y gracias al mismo sacamos los id de los diferentes parientes
        ideses.execute('''select pariente from parientes where alumno=%s''',(self.id))
        # Guardamos esos id(Los parientes) en una variable que luego sera utilizada para sacar los otros datos
        resultadoideses = ideses.fetchall()
        ideses.close()
        # Lo de abajo es en si el armado de las columnas que utilizaremos en el listctrl
        encabezado = u'columns = ["Nombres", "Apellidos", "Docente", "Parentezco", "Grado", "Division", "año", "division", "Ciclo"]\n'
        # Los datos los vamos a guardar en un archivo a parte para luego volcarlos en el listctrl
        h=open('listalum.py', 'w')
        # Nunca debemos olvidarnos de la codificacion del contenido del archivo, debajo escribimos la misma
        h.write('# -*- coding: UTF8 -*-\n')
        h.write('\n')
        h.write(encabezado.encode('utf-8'))
        h.write('\n')
        h.write('rows = [\n')
        # Ahora entramos en el ciclo de las consultas, como se tenia que tratar de consultar a varias tablas, pidiendo diferentes datos por tablas. La cosa no era nada simple. Antes habiamos mencionado que utilizamos una variable para guardar los id de los parientes, ahora debemos sacar diferentes datos por cada id de cada pariente
        for e in resultadoideses:
            # Hacemos una conexion
            apellidos=base.cursor()
            # La primer consulta pide los apellidos de los parientes de acuerdo al id del mismo, ordenado por apellido, aunque no funciona por que estamos dentro de un bucle. 
            apellidos.execute('''select apellidos from alumnos where id_alumno=%s order by apellidos ''',e)
            # Aca guardamos los apellidos que nos traen la consulta anterior
            resultadoapellidos=apellidos.fetchall()            
            apellidos.close()
            # Nos volvemos a conectar
            nombres=base.cursor()
            # Y ahora pedimos los nombres de nuevo a partir de los id de parientes
            nombres.execute('''select nombres from alumnos where id_alumno=%s''',e)
            # Guardamos los nombres
            resultadonombres=nombres.fetchall()
            nombres.close()
            # abajo viene la consulta que necesitamos para conseguir el docente del pariente y la division
            p=base.cursor()
            # Aca necesitamos el id_curso para cada pariente
            p.execute('''select id_curso from alumnos_en_curso where id_alumno=%s''',e)
            # Con estos id_curso sacaremos luego los datos de docente, grado, ciclo, y etc
            n=p.fetchall()
            p.close()
            # Nos volvemos a conectar
            parentezco=base.cursor()
            # Pero ahora necesitamos el parentezco
            parentezco.execute('''select parentezco from parientes where pariente=%s''',e)
            # Guardamos el parentezco en una variable
            resultadoparentezco = parentezco.fetchall()
            parentezco.close()
            # Y aca hacemos un truco para evitar problemas con datos que no tenemos. El tema es mas o menos asi, suele haber casos en donde como mas adelante vamos a trabajar con indices, nos vamos a encontrar con problemas por eso. Si uno por ejemplo no tiene un dato, al pedir ese dato en la variable utilizando indice nos va a dar un error. Asi que lo que hacemos es llenar dicha variable con algo que no es nada. Y si luego la variable cambia por que tiene un contenido esto evita pinchar la aplicacion. Se que es medio guazo usar algo asi. Pero es lo que funciono
            resultadodivision = ''
            resultadodocente = ''            
            resultadodivisiongrado = ''            
            resultadodivisionanio = ''            
            resultadodivisiondivision = ''            
            resultadodivisionciclo = ''
            # Ahora como antes habiamos guardado los id_curso, necesitamos utilizarlos para sacar los datos como docente, grado, division, anio y ciclo. De acuerdo a ese id_curso
            for k in n:
                # Dentro del buble nos conectamos
                division = base.cursor()
                # Y consultamos pidiendo grado de acuerdo a id_curso
                division.execute('''select grado from curso where id_curso=%s''',k)
                # Guardamos lo que devuelve la consulta en una variable
                resultadodivision = division.fetchall()
                division.close()
                # Nos volvemos a conectar
                divisiongrado=base.cursor()
                # Pedimos la division_grado
                divisiongrado.execute('''select division_grado from curso where id_curso=%s''',k)
                # Y la guardamos en una variable
                resultadodivisiongrado=divisiongrado.fetchall()
                divisiongrado.close
                # Nos volvemos a conectar
                divisionanio=base.cursor()
                # Pedimos el anio
                divisionanio.execute('''select anio from curso where id_curso=%s''',k)
                # Guardamos el resultado en otra variable
                resultadodivisionanio=divisionanio.fetchall()
                divisionanio.close()
                # Nos volvemos a conectar
                divisiondivision=base.cursor()
                # Otra consulta que pide division
                divisiondivision.execute('''select division from curso where id_curso=%s''',k)
                # Guardamos la resultado en otra variable 
                resultadodivisiondivision=divisiondivision.fetchall()
                divisiondivision.close()
                # Nos volvemos a conectar
                divisionciclo=base.cursor()
                # Otra consulta que pide ciclo
                divisionciclo.execute('''select ciclo from curso where id_curso=%s''',k)
                # Volvemos a guardar el dato en otra variable
                resultadodivisionciclo=divisionciclo.fetchall()
                divisionciclo.close()
                # Nos volvemos a conectar
                docente = base.cursor()
                # Aca consultamos por el docente
                docente.execute('''select docente from curso where id_curso=%s''',k)
                # Guardamos el mismo en otra variable
                resultadodocente = docente.fetchall()
                docente.close()
            # Aca abajo le damos utilidad a lo que comentamos antes de las consultas, de llenar una variable si la misma no tiene datos. Es decir, nos fijamos si contiene algun elemento. Si no lo contiene la llenamos con un dato nulo, que es un espacio, y si tiene algun dato es por que podemos usar indices en las variables. Esto lo hacemos con todas las variables utilizadas antes. Veamos un ejempl
            # Preguntamos por la cantidad de elementos de resultadodivision 
            if len(resultadodivision) == 0:
                # Si el len devuelve un igual a 0 es por que la misma esta vacia, entonces le asignamos un espacio
                resultadodivision = " "
            else: # en el caso que no se cumpla esa condicion podemos pedir el dato utilizando indices
                resultadodivision = resultadodivision[0][0]
            if len(resultadoparentezco) == 0:
                resultadoparentezco = " "
            else:
                resultadoparentezco = resultadoparentezco[0][0]
            if len(resultadodocente) == 0:
                resultadodocente = " "
            else:
                resultadodocente = resultadodocente[0][0]
            if len(resultadoapellidos)== 0:
                resultadoapellidos = " "
            else:
                resultadoapellidos = resultadoapellidos[0][0]
            if len(resultadonombres) == "":
                resultadonombres= " "
            else:
                resultadonombres = resultadonombres[0][0]
            if len(resultadodivisiongrado) == 0:
                resultadodivisiongrado = " "
            else:
                resultadodivisiongrado = resultadodivisiongrado[0][0]
            if len(resultadodivisionanio) == 0:
                resultadodivisionanio = " "
            else:
                resultadodivisionanio = resultadodivisionanio[0][0]
            if len(resultadodivisiondivision) == 0:
                resultadodivisiondivision = " "
            else:
                resultadodivisiondivision = resultadodivisiondivision[0][0]
            if len(resultadodivisionciclo) == 0:
                resultadodivisionciclo = " "
            else:
                resultadodivisionciclo = resultadodivisionciclo[0][0]
            # Ahora solo tenemos que unir todos los datos de las consultas en una sola variable                
            seria=resultadonombres,resultadoapellidos,resultadodocente,resultadoparentezco,resultadodivision,resultadodivisiongrado,resultadodivisionanio,resultadodivisiondivision,resultadodivisionciclo
            # Y solo nos queda que guarde el contenido de la misma variable en el archivo que usamos para consultar
            h.write('%s,\n' % str(seria))
        h.write(']')
        h.close()
        self.panel_1 = wx.Panel(self, -1) # Bueno esto ya es parte del diseño, aca tenemos el panel
        self.sizer_5_staticbox = wx.StaticBox(self.panel_1, -1, "Responsable")
        self.sizer_6_staticbox = wx.StaticBox(self.panel_1, -1, "Responsable")
        self.sizer_4_staticbox = wx.StaticBox(self.panel_1, -1, "Alumno")
        self.label_1 = wx.StaticText(self.panel_1, -1, "Resultado de la Búsqueda", style=wx.ALIGN_CENTRE)
        self.label_2 = wx.StaticText(self.panel_1, -1, "Nombre:")
        self.label_3 = wx.StaticText(self.panel_1, -1, "%s" %nombre.title()) # En estos casos usamos las variables para llenar ciertos datos. Y mediante el metodo title presentamos los mismos con la primer letra en mayuscula
        self.label_4 = wx.StaticText(self.panel_1, -1, "Apellido:")
        self.label_5 = wx.StaticText(self.panel_1, -1, "%s" %apellido.title())
        self.label_6 = wx.StaticText(self.panel_1, -1, "DNI")
        self.label_7 = wx.StaticText(self.panel_1, -1, "%s" %docu)
        self.label_8 = wx.StaticText(self.panel_1, -1, "Alumno Nº:")
        self.label_9 = wx.StaticText(self.panel_1, -1, "%s" %self.id)
        self.label_10 = wx.StaticText(self.panel_1, -1, "Nombre:")
        self.label_11 = wx.StaticText(self.panel_1, -1, "%s" %respon.title())
        self.label_12 = wx.StaticText(self.panel_1, -1, "Teléfono:")
        self.label_13 = wx.StaticText(self.panel_1, -1, "%s" %tel_resp)
        self.label_14 = wx.StaticText(self.panel_1, -1, "Celular:")
        self.label_15 = wx.StaticText(self.panel_1, -1, "%s" %cel_resp)
        self.label_16 = wx.StaticText(self.panel_1, -1, "Nombre:")
        self.label_17 = wx.StaticText(self.panel_1, -1, "%s" %respon1.title())
        self.label_18 = wx.StaticText(self.panel_1, -1, "Teléfono:")
        self.label_19 = wx.StaticText(self.panel_1, -1, "%s" %tel_respon1)
        self.label_20 = wx.StaticText(self.panel_1, -1, "Celular")
        self.label_21 = wx.StaticText(self.panel_1, -1, "%s" %cel_respon1)
        # Volvemos a abrir el archivo en donde guardamos las consultas en formato de listctrl
        w=open('listalum.py', 'r')
        # Lo recargamos de nuevo
        imp.load_module('listalum', w, 'listalum', ('.py', 'U', 1))
        # Importamos el mismo archivo como modulo
        import listalum as listalum
        w.close()
        reload(listalum)
        
        self.list_ctrl_1 = wx.ListCtrl(self.panel_1, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
        self.button_1 = wx.Button(self.panel_1, -1, "&Cerrar")
        # Aca tenemos la unica funcion de boton que hay, que es la accion de cerrar la aplicacion al precionar el boton cerrar
        self.Bind(wx.EVT_BUTTON, self.OnCerrar, self.button_1)

        # Aca ponemos en juego los datos a cargar en el listctrl
        # Tomamos los datos de las columnas y vamos ingresandols uno por uno
        for col, text in enumerate(listalum.columns):
            # En este espacio se ingresa por columna y de acuerdo a la decodificacion de los datos
            self.list_ctrl_1.InsertColumn(col, text.decode('utf-8'))
        self.itemDataMap = {}
        # En este caso volvemos a hacer algo parecido pero por fila
        for item in listalum.rows:
            # Esto es un poco mas dificil, aca vamos manejando las cadenas
            index = self.list_ctrl_1.InsertStringItem(sys.maxint, str(item[0]))
            for col, text in enumerate(item[1:]):
                self.list_ctrl_1.SetStringItem(index, col+1, text)
            self.list_ctrl_1.SetItemData(index, index)
            self.itemDataMap[index] = item
        # Abajo seteamos el ancho de las columnas. 
        self.list_ctrl_1.SetColumnWidth(0, 100)
        self.list_ctrl_1.SetColumnWidth(1, 100)
        self.list_ctrl_1.SetColumnWidth(2, 100)
        self.list_ctrl_1.SetColumnWidth(3, 100)
        self.list_ctrl_1.SetColumnWidth(4, 100)
        

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        self.SetTitle("Relaxtives")
        self.label_1.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        # end wxGlade

    def __do_layout(self):
        # Lo de abajo es sizer y todo eso, que no es tan facil de entender, si no fuera gracias a wxglade no seria igual
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.GridSizer(1, 2, 0, 0)
        grid_sizer_2 = wx.GridSizer(2, 1, 0, 0)
        sizer_6 = wx.StaticBoxSizer(self.sizer_6_staticbox, wx.HORIZONTAL)
        grid_sizer_5 = wx.GridSizer(3, 2, 0, 0)
        sizer_5 = wx.StaticBoxSizer(self.sizer_5_staticbox, wx.HORIZONTAL)
        grid_sizer_4 = wx.GridSizer(3, 2, 0, 0)
        sizer_4 = wx.StaticBoxSizer(self.sizer_4_staticbox, wx.HORIZONTAL)
        grid_sizer_3 = wx.GridSizer(4, 2, 0, 0)
        sizer_3.Add(self.label_1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 15)
        grid_sizer_3.Add(self.label_2, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_3, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_4, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_5, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_6, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_7, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_8, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_3.Add(self.label_9, 0, wx.ADJUST_MINSIZE, 0)
        sizer_4.Add(grid_sizer_3, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(sizer_4, 1, wx.EXPAND, 0)
        grid_sizer_4.Add(self.label_10, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_11, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_12, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_13, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_14, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_4.Add(self.label_15, 0, wx.ADJUST_MINSIZE, 0)
        sizer_5.Add(grid_sizer_4, 1, wx.EXPAND, 0)
        grid_sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)
        grid_sizer_5.Add(self.label_16, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_5.Add(self.label_17, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_5.Add(self.label_18, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_5.Add(self.label_19, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_5.Add(self.label_20, 0, wx.ADJUST_MINSIZE, 0)
        grid_sizer_5.Add(self.label_21, 0, wx.ADJUST_MINSIZE, 0)
        sizer_6.Add(grid_sizer_5, 1, wx.EXPAND, 0)
        grid_sizer_2.Add(sizer_6, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(grid_sizer_2, 1, wx.EXPAND, 0)
        sizer_3.Add(grid_sizer_1, 1, wx.EXPAND, 0)
        sizer_3.Add(self.list_ctrl_1, 1, wx.EXPAND, 0)
        sizer_3.Add(self.button_1, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 10)
        self.panel_1.SetSizer(sizer_3)
        sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_2)
        sizer_2.Fit(self)
        self.Layout()

    def OnCerrar(self, event):# la funcion cerrar. 
        self.Close()

if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = BusquedaAlumno(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()

# Parte del trabajo grupal hecho por

# Bruccella Cristian agustin.mendieta@gmail.com
# Monges Reinaldo reypython@gmail.com
# Carrai Pablo pablohernanjuan@hotmail.com
